package com.zenithmind.common.config;

import com.zenithmind.common.utils.RedisUtils;
import jakarta.annotation.PostConstruct;
import org.redisson.api.RBloomFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;

/**
 * 布隆过滤器配置
 * 用于防止缓存穿透
 */
@Configuration
@ConditionalOnProperty(name = "spring.redis.bloom-filter.enabled", havingValue = "true", matchIfMissing = true)
public class BloomFilterConfig {

    @Autowired
    private RedisUtils redisUtils;

    // 布隆过滤器名称常量
    public static final String USER_ID_FILTER = "user:id:filter";
    public static final String USER_PHONE_FILTER = "user:phone:filter";
    public static final String USER_EMAIL_FILTER = "user:email:filter";

    // 预期元素数量（可根据实际情况调整）
    private static final long EXPECTED_USER_COUNT = 100000;
    // 误判率（可根据实际情况调整）
    private static final double FALSE_PROBABILITY = 0.001;

    /**
     * 初始化布隆过滤器
     */
    @PostConstruct
    public void initBloomFilters() {
        initUserIdFilter();
        initUserPhoneFilter();
        initUserEmailFilter();
    }

    /**
     * 初始化用户ID布隆过滤器
     */
    private void initUserIdFilter() {
        RBloomFilter<String> userIdFilter = redisUtils.initBloomFilter(USER_ID_FILTER, EXPECTED_USER_COUNT, FALSE_PROBABILITY);
        // 此处可以添加一些初始化数据，例如从数据库加载所有用户ID
        // 实际项目中，可以注入UserMapper并调用查询方法获取所有用户ID
    }

    /**
     * 初始化用户手机号布隆过滤器
     */
    private void initUserPhoneFilter() {
        redisUtils.initBloomFilter(USER_PHONE_FILTER, EXPECTED_USER_COUNT, FALSE_PROBABILITY);
        // 此处可以添加一些初始化数据
    }

    /**
     * 初始化用户邮箱布隆过滤器
     */
    private void initUserEmailFilter() {
        redisUtils.initBloomFilter(USER_EMAIL_FILTER, EXPECTED_USER_COUNT, FALSE_PROBABILITY);
        // 此处可以添加一些初始化数据
    }
} 